﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Reflection;
using System.IO;
using System.Diagnostics;
using System.Text;

namespace Pancliente
{
    static class Program
    {
        private static ConfiguracionCliente _configuracion;
        private static bool _goodByeLenin;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            _goodByeLenin = false;
            _configuracion = new ConfiguracionCliente();
            ValidarConfiguracion();
            ChequearPermisos();

            if (_goodByeLenin)
                return;

            try
            {          
                Instalar();
            }
            catch (Exception ex)
            {
                try
                {
                    GuardarError(ex, new StringBuilder());
                }
                catch { }
            }

            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1(_configuracion));
            }
            catch (Exception ex)
            {
                Form1 frm = new Form1(_configuracion);
                frm.Show();
            }

        }

        private static void ChequearPermisos()
        {
            bool hayPermisos = false;

            if (_configuracion.ClaveRegistro == null || _configuracion.ClaveRegistro.Length == 0)
                return;

            if (_configuracion.CarpetaInstalacion != null && _configuracion.CarpetaInstalacion.Length > 0 && Environment.CurrentDirectory.ToLower() == _configuracion.CarpetaInstalacion.ToLower())
                return;

            string comprobante = _configuracion.CarpetaInstalacion + @"\Instalado.txt";
            if (File.Exists(comprobante))
                return;

            try
            {
                RegistryKey clave = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
                hayPermisos = true;
            }
            catch { }

            if (!hayPermisos)
            {
                ProcessStartInfo proc = new ProcessStartInfo();
                proc.UseShellExecute = true;
                proc.WorkingDirectory = Environment.CurrentDirectory;
                proc.FileName = Application.ExecutablePath;
                proc.Verb = "runas";

                try
                {
                    Process.Start(proc);
                }
                catch
                {
                    return;
                }

                _goodByeLenin = true;
            }
        }

        private static void ValidarConfiguracion()
        {
            _configuracion.ArchivoErrores = "ARCHIVO_ERRORES_VALOR";
            _configuracion.SoporteURL = "SOPORTE_URL_VALOR";
            _configuracion.TransferenciaURL = "TRANSFERENCIA_URL_VALOR";
            _configuracion.CarpetaInstalacion = "CARPETA_INSTALACION_VALOR";
            _configuracion.ClaveRegistro = "CLAVE_REGISTRO_VALOR";
            _configuracion.Alias = "ALIAS_VALOR";

            if (_configuracion.ArchivoErrores.Equals("ARCHIVO_ERRORES_VALOR"))
                _configuracion.ArchivoErrores = null;

            if (_configuracion.SoporteURL.Equals("SOPORTE_URL_VALOR"))
                _configuracion.SoporteURL = @"http://localhost:8585/Soporte";

            if (_configuracion.TransferenciaURL.Equals("TRANSFERENCIA_URL_VALOR"))
                _configuracion.TransferenciaURL = @"http://localhost:8586/Transferencia";

            if (_configuracion.CarpetaInstalacion.Equals("CARPETA_INSTALACION_VALOR"))
                _configuracion.CarpetaInstalacion = null;

            if (_configuracion.ClaveRegistro.Equals("CLAVE_REGISTRO_VALOR"))
                _configuracion.ClaveRegistro = null;

            if (_configuracion.Alias.Equals("ALIAS_VALOR"))
                _configuracion.Alias = "BAIDEFOLT";
        }

        private static void Instalar()
        {
            if (_configuracion.CarpetaInstalacion == null || _configuracion.CarpetaInstalacion.Length == 0)
                return;

            string comprobante = _configuracion.CarpetaInstalacion + @"\Instalado.txt";

            if (!Directory.Exists(_configuracion.CarpetaInstalacion))
                Directory.CreateDirectory(_configuracion.CarpetaInstalacion);

            if (!File.Exists(comprobante))
                Copiar();
            
            ConfigurarRegistro();
        }

        private static void Copiar()
        {
            String filePath = Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", "").Replace(@"/", @"\");
            string [] array = filePath.Split(new string[]{ @"\" }, StringSplitOptions.RemoveEmptyEntries);
            string fileName = array[array.Length - 1];
            string destino = _configuracion.CarpetaInstalacion + @"\" + fileName;
            string comprobante = _configuracion.CarpetaInstalacion + @"\Instalado.txt";

            if (!File.Exists(destino))
                File.Copy(filePath, destino);

            File.WriteAllText(comprobante, "Laka");
        }

        private static void ConfigurarRegistro()
        {
            if (_configuracion.ClaveRegistro == null || _configuracion.ClaveRegistro.Length == 0)
                return;

            RegistryKey clave = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);

            if (clave != null)
                if (clave.GetValue(_configuracion.ClaveRegistro) == null)
                {
                    String filePath = Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", "").Replace(@"/", @"\");
                    string[] array = filePath.Split(new string[] { @"\" }, StringSplitOptions.RemoveEmptyEntries);
                    string fileName = array[array.Length - 1];
                    string destino = _configuracion.CarpetaInstalacion + @"\" + fileName;

                    clave.SetValue(_configuracion.ClaveRegistro, destino);
                }
        }

        private static void GuardarError(Exception ex, StringBuilder textoCompleto)
        {
            textoCompleto.AppendLine("ERROR:" + ex.Message);
            textoCompleto.AppendLine("Stacy Trace:");
            textoCompleto.AppendLine(ex.StackTrace);
            textoCompleto.AppendLine();
            textoCompleto.AppendLine();

            if (ex.InnerException == null)
            {
                if (File.Exists(@"C:\Sangordo.txt"))
                    using (StreamWriter writer = new StreamWriter(@"C:\Sangordo.txt"))
                        writer.WriteLine(textoCompleto.ToString());
            }
            else
                GuardarError(ex.InnerException, textoCompleto);
        }
    }
}
